﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;

/*
 订单管理的控制台程序，能够实现添加订单、删除订单、修改订单、查询订单（按照订单号、商品名称、客户等字段进行查询）功能。
提示：主要的类有Order（订单）、OrderItem（订单明细项），OrderService（订单服务）
      订单数据可以保存在OrderService中一个List中。在Program里面可以调用OrderService的方法完成各种订单操作。
要求：
（1）使用LINQ语言实现各种查询功能，查询结果按照订单总金额排序返回。
（2）在订单删除、修改失败时，能够产生异常并显示给客户错误信息。
（3）作业的订单和订单明细类需要重写Equals方法，确保添加的订单不重复，每个订单的订单明细不重复。
（4）订单、订单明细、客户、货物等类添加ToString方法，用来显示订单信息。
（5）OrderService提供排序方法对保存的订单进行排序。默认按照订单号排序，也可以使用Lambda表达式进行自定义排序。*/
namespace OrderApp2
{
    class Program
    {
       
        static void Main(string[] args)
        {
            while(true)
            {
                Console.WriteLine("\n**************************");
                Console.WriteLine("1.增加订单\n2.删除订单\n3.修改订单\n4.查询订单\n5.退出系统");
                Console.WriteLine("**************************");
                Console.WriteLine("请选择你要进行的操作:");
                int mychoice = int.Parse(Console.ReadLine());
                switch(mychoice)
                {
                    //增添订单
                    case 1:

                        Console.WriteLine("***订单号***：");
                        int orderID = int.Parse(Console.ReadLine());
                        Console.WriteLine("***顾客的会员号***：");
                        int cusID = int.Parse(Console.ReadLine());
                        Console.WriteLine("***订单的配送地址***：");
                        string shippingAddress = Console.ReadLine();

                        Order new_order = new Order(orderID, cusID, DateTime.Now, shippingAddress);//创建新订单

                        bool mark = false;//表示该订单号未创建

                        foreach(Order order in OrderService.orders)
                        {
                            if (order!=new_order)
                            {
                                mark =false;
                            }
                            else
                            {
                                mark = true;
                                Console.WriteLine("请勿重复添加订单！");
                            }
                        }
                        if (mark == false)
                        {
                            OrderService.order_toAdd(new_order);
                                OrderService.sortBy_orderID();

                            while (true)
                            {
                                //输入订单明细项
                                Console.WriteLine("**商品名称**:");
                                string itemName = Console.ReadLine();
                                Console.WriteLine("**商品单价**：");
                                double itemPrice = double.Parse(Console.ReadLine());
                                Console.WriteLine("**数量**：");
                                int itemNum = int.Parse(Console.ReadLine());

                                OrderItem new_item = new OrderItem(itemName, itemPrice, itemNum);
                                //该明细是否已存在
                                bool mark_i = false;
                                foreach (OrderItem item in new_order.orderItems)
                                {
                                    if (item == new_item)
                                        mark_i = true;
                                }
                                if (mark_i == false)
                                {
                                    new_order.order_addItems(new_item);
                                }
                                else
                                {
                                    Console.WriteLine("请勿重复添加订单明细！");
                                }
                                Console.WriteLine("1.完成       |2. 继续添加");
                                Console.WriteLine("请选择你要继续的操作：");
                                int mychoice2 = int.Parse(Console.ReadLine());
                                if (mychoice2 == 1)
                                {
                                    break;
                                }
                            }
                        }
                          break;

                    case 2:
                        try
                        {
                            Console.WriteLine("***要删除的订单号***：");
                            int orderID_del = int.Parse(Console.ReadLine());
                            bool del = OrderService.order_toDel(orderID_del);
                            if (del == false)
                                throw new OrderService.OrderServiceException("目标不存在！");

                        }
                        catch(OrderService.OrderServiceException e)
                        {
                            Console.WriteLine(e.Message);

                        }
                        break;

                    case 3:
                        try
                        {
                            Console.WriteLine("***要修改的订单号***:");
                            int orderid_alter = int.Parse(Console.ReadLine());
                            ArrayList alter_content = new ArrayList();
                            alter_content.Add(0);
                            Console.WriteLine("1.顾客会员号\t |2.配送地址\t |3.商品名称\t|4.商品单价\t|5.商品数量\t");
                            Console.WriteLine("请选择要进行修改的订单项：");
                            int i = int.Parse(Console.ReadLine());
                            switch (i)
                            {
                                case 1:
                                    Console.WriteLine("请输入新的顾客会员号：");
                                    int cusid = int.Parse(Console.ReadLine());
                                    alter_content.Insert(0, cusid);
                                    break;
                                case 2:
                                    Console.WriteLine("请输入新的配送地址：");
                                    string str1 = Console.ReadLine();
                                    alter_content.Insert(0, str1);
                                    break;
                                case 3:
                                    Console.WriteLine("请输入新的商品名称：");
                                    string name = Console.ReadLine();
                                    alter_content.Insert(0, name); 
                                    break;
                                case 4:
                                    Console.WriteLine("请输入新的商品单价：");
                                    double price  = double.Parse(Console.ReadLine());
                                    alter_content.Insert(0, price);
                                    break;
                                case 5:
                                   Console.WriteLine("请输入新的商品数量：");
                                    int num =int.Parse( Console.ReadLine());
                                    alter_content.Insert(0, num);
                                    break;
                            }

                            bool alter = OrderService.order_toAlter(orderid_alter, i, alter_content);
                            if (!alter)
                            {
                                throw new OrderService.OrderServiceException("目标不存在！");
                            }
                        }
                        catch(OrderService.OrderServiceException e)
                        {
                            Console.WriteLine(e.Message);

                        }
                        break;

                    case 4:
                        Console.WriteLine("请选择你要进行查询的对象：");
                        Console.WriteLine("1.订单号        | 2.顾客会员号       |3.商品名称");
                        string a = Console.ReadLine();
                        switch (a)
                        {
                            case "1":
                                Console.WriteLine("请输入订单号：");
                                int orderid_tosearch = int.Parse(Console.ReadLine());

                                List<Order> Order_searched1 = new List<Order>();
                                Order_searched1 = OrderService.SearchBy_orderID(orderid_tosearch);

                                foreach(Order order in Order_searched1)
                                {
                                    Console.WriteLine(order);
                                    foreach(OrderItem orderItem in order.orderItems)
                                    {
                                        Console.WriteLine(orderItem);
                                    }
                                    break;
                                }
                                break;

                            case "2":
                                Console.WriteLine("请输入顾客会员号：");
                                int cusid_tosearch = int.Parse(Console.ReadLine());
                                List<Order> Order_searched2 = new List<Order>();
                                Order_searched2 = OrderService.SearchBy_cusID(cusid_tosearch);

                                foreach (Order order in Order_searched2)
                                {
                                    Console.WriteLine(order);
                                    foreach (OrderItem orderItem in order.orderItems)
                                    {
                                        Console.WriteLine(orderItem);
                                    }
                                }
                                break;

                            case "3":
                                Console.WriteLine("请输入商品名称：");
                                string itemname_tosearch = Console.ReadLine();
                                List<Order> Order_searched3 = new List<Order>();
                                Order_searched3 = OrderService.SearchBy_itemName(itemname_tosearch);

                                foreach (Order order in Order_searched3)
                                {
                                    Console.WriteLine(order);
                                    foreach (OrderItem orderItem in order.orderItems)
                                    {
                                        Console.WriteLine(orderItem);
                                    }
                                }
                                break;
                        }
                        break;

                    default:
                        Console.WriteLine("输入错误！");
                        break;
                }
        

            }

        }
    }
}
